package sparkml_study

import org.apache.spark.sql.SparkSession
//  导入卡方检验需要用到的包
import org.apache.spark.ml.linalg.{Vector,Vectors}
import org.apache.spark.ml.stat.ChiSquareTest

object JiaSheJianYan {
  def main(args: Array[String]): Unit = {

    /*
          假设检验在机器学习中的应用
    尽管假设检验在传统统计学中更为常见，但在机器学习中，它也可以用于以下几种情况：

    1.模型评估与比较：

    当我们要评估两个模型的性能时（例如模型A和模型B的准确率），假设检验可以帮助判断两者的性能差异是否显著。例如，是否模型A的准确率显著高于模型B。
    2.特征重要性检验：

    在训练过程中，可以使用假设检验来判断某个特征对预测结果的影响是否显著。例如，在决策树模型中，可以通过检验每个特征的增益来判断该特征是否对模型有重要作用。
    3.过拟合与欠拟合的检验：

    在模型评估时，假设检验可以帮助判断模型的复杂度是否合适，是否存在过拟合（模型在训练数据上表现很好，但对新数据预测差）。
    4.模型参数的显著性检验：

    在一些机器学习模型（如线性回归、逻辑回归）中，假设检验可用于评估模型中某些参数的显著性。例如，检查回归系数是否显著不同于零，判断某个特征是否有助于预测目标变量。
     */


    val spark=SparkSession.builder()
      .master("local[*]")
      .appName("假设检验")
      .getOrCreate()

    import spark.implicits._

  //  创建实验数据
    val data=Seq(
      (0.0,Vectors.dense(3.5,40.0)),
      (0.0,Vectors.dense(3.5,30.0)),
      (1.0,Vectors.dense(1.5,30.0)),
      (0.0,Vectors.dense(1.5,20.0)),
      (0.0,Vectors.dense(0.5,10.0))
    )

    //  将实验数据转化为dataframe
    val df=data.toDF("label","features")


    //  调用ChiSquareTest包中的test()函数，将(特征，标签)对转成一个列联矩阵，计算卡方统计量
    val chi=ChiSquareTest.test(df,"features","label").head


    //  分别获取卡方分配右尾机率,自由度,统计值
    //  右尾机率
    println(s"pValues=${chi.getAs[Vector](0)}")

    //  自由度
    println(s"degreesOfFreedom${chi.getSeq[Int](1).mkString("[",",","]")}")

    //  统计值
    println(s"statistics${chi.getAs[Vector](2)}")





    spark.close()
  }

}
